package cn.tedu.review;

/**
 * @Author 金帮嘉诚
 * @Date 2021-06-15 周二 9:40
 */
/*本类用于复习面向对象2*/
/**
 * 知识点：
 * 构造方法
 * 继承
 * 代码块
 * this
 * super
 * */
public class ReviewOOP2 {
    public static void main(String[] args) {
        System.out.println("************new Cat（）");
        new Cat();//匿名对象

        System.out.println("************Cat c=new Cat（\"\",1,10.8）");
        Cat c = new Cat("旺财", 1, 10.8);//通过全参构造创建

        /*全参构造完成了：创建对象+赋值操作*/
        System.out.println("************DD d=new DD();");
        DD d = new DD();
        d.eat();
        System.out.println(d.price);

        /*子类不可以使用父类的私有资源，原因是不可见*/
        //d.play();

    }
}

class Cat {
    String name;
    int id;
    double price;

    /*代码块的执行顺序：静态代码块 构造代码块 构造方法 对象创建 */
    /*构造代码块:{}+类里方法外+用于提取所有构造方法的共性
     * +创建对象时触发，优先于构造方法执行*/ {
        System.out.println("构造代码块");
    }

    /*静态代码块：static{}+类里方法外+用于加载一些需要在第一时间就加载且只加载一次的资源+
     * 随着类的加载而加载，优先于对象进行加载，只加载一次*/
    static {
        System.out.println("静态代码块");
    }

    public void eat() {
        System.out.println("干饭方法");
        /*局部代码块：{}+方法里+用于控制变量的作用范围，越小越好+*/
        {
            System.out.println("局部代码块");
        }
    }

    /*构造方法：与类同名且没有返回值的方法，用于创建对象，创建对象时自动触发，每次创建对象都会执行*/
    public Cat() {
        /*this作用2：
        可以调用构造方法，注意必须写在首行，不能来回互相调用，会死循环
        请注意：主动调用构造的方式就是通过this或super进行调用，注意格式*/
        this("this调用全参构造", 1, 1);//调用含参构造
        System.out.println("无参构造");
    }

    public Cat(String name, int id, double price) {
        System.out.println("全参构造");
        /*this作用1：
        当本类的成员变量与局部变量同名时，可以指定本类的成员变量，规避就近原则
        * 可以把this看作：Cat this = new Cat（），相当于本类的对象*/
        this.name = name;//调用参数赋值给成员变量
        this.id = id;
        this.price = price;
    }
}

/*通过关键字extends建立继承关系*/
class DD extends Cat {
    /*重写的原则：两同两小一大*/

    String name;

    public DD(){
        /*super的作用2：调用父类的无餐构造
        * 此句默认存在，创建子类对象时，会先调用父类的构造函数*/
        super();
    }
    @Override/*注解：表明这是一个重写的方法*/
    public void eat() {
        /*super的作用1：父子类变量同名时，指定父类的成员变量name*/
        System.out.println("super.name = " + super.name);
        System.out.println("爱吃小鱼干");
    }

    /*子类也可以有自己的特有的方法*/
    public void jump() {
        System.out.println("DD跳的可高了");
    }
}
